//
//  Emoticon.swift
//  测试-01-表情键盘
//
//  Created by teacher on 15/8/5.
//  Copyright © 2015年 itheima. All rights reserved.

import UIKit

/**
1. Emoticons.bundle的根目录中有一个 emoticons.plist
packages数组的每一项字典中的 id 对应的是每一套表情的目录名
2. 每一个表情目录下，都有一个 info.plist 文件
group_name_cn 记录的表情包的名字
emoticons 数组，记录的整套表情的数组
3. 表情字典信息
chs:    定义的发布微博以及网络传输使用的微博文字字符串
png:    在客户端显示的图片名称

code:   emoji要显示的16进制字符串！
*/

/// 表情包模型 - 从 emoticons.plist 加载
class EmoticonPackage: NSObject {
    /// 目录名
    var id: String
    /// 分组名
    var groupName: String = ""
    /// 表情数组
    var emoticons: [Emoticon]?
    
    // 默认值可以做到对之前的代码不做任何调整
    init(id: String, groupName: String = "") {
        self.id = id
        self.groupName = groupName
    }
    
    /// 加载所有的表情包(外部接口)
    static var packages = EmoticonPackage.loadPackages()
    /// 加载所有的表情包
    class func loadPackages() -> [EmoticonPackage] {
        // 1. 加载路径
        let path = bundlePath.stringByAppendingPathComponent("emoticons.plist")
        
        // 2. 加载 plist
        let dict = NSDictionary(contentsOfFile: path)!
        let array = dict["packages"] as! [[String: AnyObject]]
        
        // 3. 遍历数组
        var arrayM = [EmoticonPackage]()
        //添加最近分组
        let currentPackge = EmoticonPackage(id: "", groupName: "最近").addEmptyBtn()
        arrayM.append(currentPackge)
        
        for d in array {
            let id = d["id"] as! String
            // 链式响应
            let package = EmoticonPackage(id: id).loadEmoticons().addEmptyBtn()
            arrayM.append(package)
        }
        return arrayM
    }
    
    /// 加载当前对象对应的表情数组，从 info.plist 中加载并完成完整的模型信息
    /// Self 表示返回本类的对象
    func loadEmoticons() -> Self {
        
        // 1. 路径
        let path = EmoticonPackage.bundlePath.stringByAppendingPathComponent(id).stringByAppendingPathComponent("info.plist")
        let dict = NSDictionary(contentsOfFile: path)!
        
        groupName = dict["group_name_cn"] as! String
        let array = dict["emoticons"] as! [[String: String]]
        
        // 2. 遍历数组
        emoticons = [Emoticon]()
        var index = 0
        for d in array {
            // 将表情包的 id 传递给 表情，方便拼接路径
            emoticons?.append(Emoticon(id: id, dict: d))
            index++
            if index == 20 { //如果到了第21个,添加删除按钮
                emoticons?.append(Emoticon(delete: true))
                index = 0
            }
        }
        return self
    }
    
    /// 最后一页不够21,补刀20个空白按钮,最后添加一个删除按钮
    private func addEmptyBtn() ->Self{
        if emoticons == nil {  //最近 package,什么都不做
            emoticons = [Emoticon]()
        }
        
        let index = emoticons!.count % 21
        /// index = 0表示
        if index > 0 || emoticons?.count == 0 {
            for _ in index...19 { //添加空白按钮
                emoticons?.append(Emoticon(delete: false))
            }
            emoticons?.append(Emoticon(delete: true)) //添加删除按钮
        }
        return self
    }
    
    /// 表情包的路径
    static let bundlePath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent("Emoticons.bundle")
    
    override var description: String {
        return "\(id) \(groupName) \(emoticons)"
    }
}

/// 表情模型
class Emoticon: NSObject {
    /// 表情目录
    var id: String?
    /// 发送给服务器的表情文字
    var chs: String?
    /// 本地显示的图片文件名
    var png: String?
    /// 图片完整路径
    var imagePath: String {
        //判断是否是`图片`表情
        if chs == nil {
            return ""
        }
        return EmoticonPackage.bundlePath.stringByAppendingPathComponent(id!).stringByAppendingPathComponent(png!)
    }
    /// 被单击次数
    var times: Int = 0
    /// emoji 的代码
    var code: String? {
        didSet {
            // 扫描器
            let scanner = NSScanner(string: code!)
            var value: UInt32 = 0
            scanner.scanHexInt(&value)
            
            emoji = String(Character(UnicodeScalar(value)))
        }
    }
    /// emoji 字符串
    var emoji: String?
    
    /// true: 删除按钮 ,false: 空白按钮, nil: 表情按钮
    var deleteBtn:Bool? = false
    
    init(delete: Bool) {
        super.init()
        deleteBtn = delete
    }
    
    init(id: String, dict: [String: String]) {
        self.id = id
        super.init()
        
        // 会根据 字典中的 值对 顺序调用 setValueForKey(key存在)
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    override var description: String {
        return "\(chs) \(png) \(code)"
    }
}
